﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ConsoleApp_test_bd.Modelo;

namespace ConsoleApp_test_bd
{
    class Program
    {
        static void Main(string[] args)
        {
            // crear un variable que maneja el flujo desde la base de
            // datos, la cual se llama contexto
            BD_S95Entities contexto = new BD_S95Entities();
            #region operaciones CRUD (crear, leer, actualizar y eliminar)
            #region add  objetos a la bd
            //// 1º crear el objeto y posteriormente agregarlo a la base de
            //// base de datos
            //Proveedor nuevoProveedor = new Proveedor();
            //nuevoProveedor.Nombre = "J";
            //nuevoProveedor.Apellido = "K";
            //nuevoProveedor.Telefono = "133";

            //// el objeto se agregar al contexto
            //contexto.Proveedor.Add(nuevoProveedor);
            //// agregar el objeto a la base de datos
            //int cant_objetos_agregados_correctamente =  contexto.SaveChanges();
            //if(cant_objetos_agregados_correctamente > 0)
            //    Console.WriteLine("Ok...");
            //else
            //    Console.WriteLine("Error");

            #endregion
            // comentario
            #region lectura (ejemplo simple)
            List<Proveedor> lista_Proveedores = new List<Proveedor>();
            // select *from proveedores
            lista_Proveedores = contexto.Proveedor.ToList();
            Console.WriteLine("Listado de proveedores");
            foreach (var  item in lista_Proveedores)
            {
                Console.WriteLine("ID: {0}   Nombre: {1}",item.Id_proveedor, item.Nombre);
            }
            #endregion
            #region  actualizar un objeto
            int Id_proveedor_a_actualizar = 1;
            Proveedor aEditar = contexto.Proveedor.Find(Id_proveedor_a_actualizar);
            // vs2010
            //Proveedor aEditar2010 = contexto.Proveedor.Where(x => x.Id_proveedor == Id_proveedor_a_actualizar).Single();
            aEditar.Nombre = "Nuevo J";

            contexto.SaveChanges();
            #endregion
            #region eliminar 
            contexto.Proveedor.Remove(contexto.Proveedor.Find(Id_proveedor_a_actualizar));
            contexto.SaveChanges();
            #endregion
            #region Propiedades de navegación
            #region Agregar un objeto a la base de datos y su detalle asociado.
            // 
            Proveedor nuevoProveedor = new Proveedor();
            nuevoProveedor.Nombre = "Z";
            nuevoProveedor.Telefono = "123";
            nuevoProveedor.Apellido = "dondeZ";

            // crear  productos
            Producto nuevoProducto0 = new Producto();
            nuevoProducto0.Nombre = "PC";
            nuevoProducto0.Cantidad = 23;

            Producto nuevoProducto1 = new Producto();
            nuevoProducto1.Nombre = "Note";
            nuevoProducto1.Cantidad = 3;

            // asociar los productos al proveedor
            nuevoProducto0.Proveedor = nuevoProveedor;
            nuevoProducto1.Proveedor = nuevoProveedor;
            // crear una lista de productos
            List<Producto> listaProductos = new List<Producto>();
            listaProductos.Add(nuevoProducto0);
            listaProductos.Add(nuevoProducto1);

            // asociar la lista de productos al proveedor
            nuevoProveedor.Producto = listaProductos;

            // agregar el proveedor al contexto
            contexto.Proveedor.Add(nuevoProveedor);
            contexto.SaveChanges();
            #endregion

            #region buscar un proveedor y mostrar su lista de productos asociada
            Proveedor aBuscar = new Proveedor();
            aBuscar = contexto.Proveedor.Find(1);
            Console.WriteLine("Nombre proveedor: {0}",aBuscar.Nombre);
            foreach (var item in aBuscar.Producto)
            {
                Console.WriteLine("Nombre: {0}   Cantidad:{1}",item.Nombre,item.Cantidad);
            }
            #endregion

            #region mostrar un lista de los proveedores y mostrar la lista de productos asociados
            List<Proveedor> listProveedores = new List<Proveedor>();
            listProveedores = contexto.Proveedor.ToList();

            foreach (var item in listProveedores)
            {
                Console.WriteLine("Proveedores:: {0}",item.Nombre);
                foreach (var item_prod in item.Producto)
                {
                    Console.WriteLine("Productos: {0}", item_prod.Nombre);
                }                
            }

            #endregion
            #endregion
            #region LINQ:
            //Consulta simple a una entidad
            // select *from proveedor
            var listasProv = from prov in contexto.Proveedor select prov;

            var listasProv_columnas = from prov in contexto.Proveedor select new { prov.Nombre};

            var listasProv_filas = from prov in contexto.Proveedor 
                                   where prov.Id_proveedor == 1 && prov.Nombre.StartsWith("a")
                                   select new { prov.Nombre };

            foreach (var item in listasProv_filas)
            {
                Console.WriteLine(item.Nombre);
            }

            // Consulta a varias entidades

            var Consulta_a_varias_entidades = from pd in contexto.Producto
                                              join pv in contexto.Proveedor
                                              on pd.Id_proveedor equals pv.Id_proveedor
                                              select new {NombreProducto = pd.Nombre,NombreProveedor= pv.Nombre};

            foreach (var item in Consulta_a_varias_entidades)
            {
                Console.WriteLine("{0} {1}",item.NombreProducto,item.NombreProveedor);
            }

            var Consulta_a_varias_entidades_condicion = from pd in contexto.Producto
                                              join pv in contexto.Proveedor
                                              on pd.Id_proveedor equals pv.Id_proveedor
                                              where pd.Nombre.StartsWith("a")
                                              select new { NombreProducto = pd.Nombre, NombreProveedor = pv.Nombre };


            #endregion

            #endregion

            Console.ReadKey();
        }
    }
}
